import com.test.java01.Student;
import com.test.java01.User;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class StudentSystem {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //创建集合
        ArrayList<User> user=new ArrayList<>();//登录页面
        ArrayList<Student> stu = new ArrayList<>();//主页面

        //调用登录页面--方法
        Main_Enter(user);

        //调用主菜单方法
        while(true) {
            Menu();
            System.out.println("请输入您的选择：");
            int choose = sc.nextInt();
            switch (choose) {
                case 1 -> Add(stu);
                case 2 -> Delete(stu);
                case 3 -> Modify(stu);
                case 4 -> Query(stu);
                default -> System.exit(0);//程序终止
            }
        }
    }
    //登录注册主页面--方法
    public static void Main_Enter(ArrayList user)
    {
        Scanner sc=new Scanner(System.in);
        register();
        int choice=sc.nextInt();
        switch (choice){
            case 1->enter(user);//登录
            case 2->enroll(user);//注册
            case 3->ForgetPassword(user);//忘记密码
            default -> System.out.println("没有此选项，请重新选择！");
        }
    }

    //登录，注册主界面
    public static void register() {
        System.out.println("---------------------------------------------------");
        System.out.println("欢迎来到学生管理系统！");
        System.out.println("请选择以下操作：");
        System.out.println("1、登录"+"\t"+"2、注册"+"\t"+"3、忘记密码");
        System.out.println("---------------------------------------------------");
        System.out.println("请选择：");
    }
    //登录
    public static void enter(ArrayList user){
        int m=0,n=0;
        Scanner sc=new Scanner(System.in);
        while(true) {
            System.out.println("请输入用户名：");
            String usname = sc.next();
            if (!(enter_username(user, usname))) {
                System.out.println("用户名不存在，请注册后再登录");
                Main_Enter(user);
                break;
            }
            else {
                while (true) {
                    System.out.println("请输入用户密码：");
                    String uscode = sc.next();
                    if (enter_usercode(user, uscode)) {
                        insure_number();//密码正确的话，调用验证码方法
                        break;
                    }
                    n++;
                    if (n >= 3) {
                        System.out.println("是否要修改密码：1（yes）or 2(no)");
                        int choice = sc.nextInt();
                        switch (choice) {
                            case 1 -> ForgetPassword(user);
                            case 2 -> Main_Enter(user);
                            default -> System.exit(0);
                        }
                        break;
                    }
                }

            }
            break;
        }
    }
    //注册
    public static void enroll(ArrayList user){
        Scanner sc=new Scanner(System.in);
        User us=new User();
        int num=1;
        //先验证格式，再判断唯一
        while(true) {
            System.out.println("请输入用户名");
            String name = sc.next();
            if(!(construct(name)))//对输入的用户名进行判断
                continue;//如果用户名不符合格式，就直接重新下一次输入
            //对象调用方法--找对象：在集合里找,对象的类型s是User
            for (int i = 0; i < user.size(); i++) {
                User peo = (User) user.get(i);//这点很重要,强制类型转换
                String na = peo.getUsername();
                if (na.equals(name)){
                    System.out.println("该用户名已存在！请重新输入");
                    continue;//继续输入，下面操作无需继续
                }
            }
            //在集合中全部查找完，说明无重复，给对象赋值

            us.setUsername(name);
            break;
        }
        while(true) {
            System.out.println("请输入密码：");
            String code1=sc.next();
            System.out.println("请再次输入密码：");
            String code2=sc.next();
            if(Ifequal(code1,code2)){
                us.setPassword(code2);
                break;
            }
        }
        while(true) {
            System.out.println("请输入身份证号码：");
            String id = sc.next();
            if(judge_identity(user,id)) {
                us.setIdentity(id);//返回值为true，说明所以格式都正确，添加到对象里
                break;//跳出循环
            }
        }
        while(true){
            System.out.println("请输入手机号码：");
            String number=sc.next();
            if(judge_phone(user,number)) {
                us.setPhone(number);
                break;
            }
        }
        //最后，把对象添加到集合中
        user.add(us);
        System.out.println("注册成功！请登录！");
        Main_Enter(user);
    }
    //忘记密码
    public static void ForgetPassword(ArrayList user){
        Scanner sc=new Scanner(System.in);
        while(true) {
            System.out.println("请输入用户名：");
            String name = sc.next();
            if(enter_username(user, name)) {
                while (true) {
                    System.out.println("请输入身份证号：");
                    String number = sc.next();
                    //身份证号码格式正确时，再找该身份证号码是否存在
                    if (judge_identity(user, number)) {
                        if (Ifidentity(user, number)) {
                            //身份证号码若存在，就继续判断手机号码格式及是否存在
                            while (true) {
                                System.out.println("请输入手机号码：");
                                String phone = sc.next();
                                if (judge_phone(user, phone)) {
                                    //手机号码格式这里调用了两个方法，是为了找到对象的索引
                                    if (Ifphone(user, phone)) {
                                        //都一致就可以修改密码了
                                        while (true) {
                                            System.out.println("请输入要修改的密码：");
                                            String code1 = sc.next();
                                            System.out.println("请再输一次");
                                            String code2 = sc.next();
                                            if (Ifequal(code1, code2)) {
                                                int index=IndexPhone(user,phone);
                                                User per = (User) user.get(index);
                                                per.setPassword(code2);
                                                //修改过密码之后，重新登录
                                                System.out.println("请重新登录：");
                                                enter(user);
                                                break;
                                            }
                                            //两次输入的不相同，就一直循环输入
                                        }
                                    } else {
                                        System.out.println("账户信息不匹配，修改失败！");
                                        continue;
                                    }
                                    break;
                                }
                            }

                        } else {
                            System.out.println("账户信息不匹配，修改失败");
                            continue;
                        }

                        break;
                    }

                }
                break;
            }

        }

    }
    //判断用户名--组成
    public static boolean construct(String username){
        int count=0;//判断不能是纯数字，只要有一个字母就不用接着判断了
        if(judge_length(username)==1){
            //判断是否是字母加数字组成
            for(int j=0;j<username.length();j++){
                if(username.charAt(j)>='0' && username.charAt(j)<='9')
                    continue;
                else if(username.charAt(j)>='A' && username.charAt(j)<='Z'
                        || username.charAt(j)>='a' && username.charAt(j)<='z'){
                    count++;
                    continue;
                }
                else {
                    System.out.println("用户名必须由字母和数字组合！");
                    break;
                }
            }
            if(count==0)
                System.out.println("用户名不能是纯数字,请重新输入！");
            else
                return true;
        }
        else
            System.out.println("用户名长度必须在3~15位之间！");
        return false;
    }
    //判断用户名--长度
    public static int judge_length(String username){
        //遍历
        if(username.length()>=3 && username.length()<=15)
            return 1;
        else
            return 0;
    }
    //验证身份证号码
    public static boolean judge_identity(ArrayList user,String id){
        int count=0;
        if ((id.length() == 18)) {
            for (int i = 0; i < id.length(); i++) {
                if (i==0 &&id.charAt(0) == '0') {
                    System.out.println("身份证号码第一位格式不正确！");
                    return false;
                }
                else if(i<id.length()-1) {
                    if(!(id.charAt(i)>='0' && id.charAt(i)<='9')){
                        System.out.println("前十七位必须位数字！");
                        return false;
                    }

                    }
                else{
                    if(!(id.charAt(17)>='0' && id.charAt(17)<='9'|| id.charAt(17)>='A' && id.charAt(17)<='Z'|| id.charAt(17)>='a' && id.charAt(17)<='z')) {
                        System.out.println("身份证号码最后一位格式不正确！");
                        return false;
                    }
                }

            }
            return true;
        }
        else {
            System.out.println("身份证号长度不正确！应为18位！");
        }
        return false;
    }
    //身份证号码是否存在
    public static boolean Ifidentity(ArrayList user,String number){
        for (int i = 0; i < user.size(); i++) {
            User id=(User)user.get(i);
            if(id.getIdentity().equals(number))
                return true;
        }
        return false;
    }
    //手机号码是否存在
    public static boolean Ifphone(ArrayList user,String phone){

        if(IndexPhone(user,phone)>=0)
            return true;
        return false;
    }
    public static int IndexPhone(ArrayList user,String phone){
        for (int i = 0; i < user.size(); i++) {
            User pho=(User) user.get(i);
            if(pho.getPhone().equals(phone))
                return i;
        }
        return -1;
    }


    //手机号码-格式验证
    public static boolean judge_phone(ArrayList user,String number){
        if(number.length()==11){
            for(int i=0;i<number.length();i++){
                if(number.charAt(0)=='0'){
                    System.out.println("手机号码首位格式错误！");
                    return false;
                }
                if(!(number.charAt(i)>='0' && number.charAt(i)<='9')) {
                    System.out.println("手机号码应为数字！");
                    return false;
                }
            }
            return true;
        }
        else
            System.out.println("手机号码必须为11位！");
        return false;
    }
    //判断密码是否相等--方法
    public static boolean Ifequal(String code1,String code2){
        if (code1.equals(code2))
            return true;
        else
            System.out.println("两次输入的密码不相同！");
        return false;
    }
    //登录--用户名验证
    public static boolean enter_username(ArrayList user,String usname){
        int flag=0;
        for (int i = 0; i < user.size(); i++) {
            User client=(User)user.get(i);
            if(client.getUsername().equals(usname))
                flag=1;
        }
        if(flag==0) {
            return false;
        }
        return true;
    }
    //登录--密码验证
    public static boolean enter_usercode(ArrayList user,String uscode){
        int flag=0;
        for (int i = 0; i < user.size(); i++) {
            User person=(User)user.get(i);

            if(person.getPassword().equals(uscode))
                flag=1;
        }
        if(flag==0) {
            System.out.println("密码错误！");
            return false;
        }
        return true;
    }
    //登录--验证码
    //验证码
    public static void insure_number(){
        Scanner sc=new Scanner(System.in);
        while(true){
            String str1="";
            char[] arr2=judge_number();//调用方法
            for(int j=0;j< arr2.length;j++) {
                System.out.print(arr2[j]);
                str1=str1+arr2[j];
            }
            System.out.println(" ");
            System.out.println("请输入验证码：");
            String str2=sc.next();
            if(str1.equals(str2)) {
                System.out.println("验证成功！");
                break;
            }
        }
    }
    public static char[] judge_number(){
        char[] arr = new char[4];
        Random r = new Random();
        //先生成字母验证码
        for (int i = 0; i < arr.length - 1; i++) {
            while(true) {
                int num = r.nextInt(58) + 65;
                if (num >= 65 && num <= 90 || num >= 97 && num <= 122) {
                    arr[i] = (char) num;
                    break;
                }
            }
        }
        int m = r.nextInt(10);
        arr[arr.length - 1] = (char) (48 + m);
        //打乱数组索引，从而实现数字的位置随机出现--随机交换索引
        for (int j = 0; j < arr.length; j++) {
            int a = r.nextInt(arr.length);
            int b = r.nextInt(arr.length);
            if (a != b) {
                char temp = arr[a];
                arr[a] = arr[b];
                arr[b] = temp;
            }
        }
        return arr;

    }
    //主菜单方法
    public static void Menu(){
        System.out.println("--------------------欢迎来到学生管理系统------------------");
        System.out.println("1、添加学生");
        System.out.println("2、删除学生");
        System.out.println("3  修改学生");
        System.out.println("4、查询学生");
        System.out.println("5、退出");
        System.out.println("---------------------------------------------------------");

    }
    //添加学生
    public static void Add(ArrayList<Student> stu){
        //需求：学生的id唯一
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要添加的学生人数：");
        int num=sc.nextInt();
        for (int i = 0; i < num; i++) {
            //创建学生对象
            Student peo =new Student();
            //判断id是否唯一，每输入一个id就要遍历集合查找是否该id已经存在
            while(true) {
                System.out.println("请输入id：");
                String stuid = sc.next();
                for (int j = 0; j < stu.size(); j++) {
                    if (stuid == stu.get(j).getId()) {
                        System.out.println("该Id已经存在：");
                    }
                }
                peo.setId(stuid);
                break;
            }

            System.out.println("请输入姓名：");
            peo.setName(sc.next());
            System.out.println("请输入年龄：");
            peo.setAge(sc.nextInt());
            System.out.println("请输入家庭住址：");
            peo.setAddress(sc.next());
            //将对象添加到集合中
            stu.add(peo);
        }
    }
    //删除学生
    public static void Delete(ArrayList<Student> stu){
        int num=1;
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要删除的学生id:");
        String stuid=sc.next();
        //判断id是否存在，遍历集合查找，若存在才删除
        for(int i=0;i<stu.size();i++){
            if(stu.get(i).getId().equals(stuid)){
                stu.remove(i);
                num=0;
            }
        }
        if(num==1)
            System.out.println("该Id不存在！");
    }
    //修改学生
    public static void Modify(ArrayList<Student> stu){
        int m=1;
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要修改的学生id：");
        String stuid=sc.next();
        for (int i = 0; i < stu.size(); i++) {
            if(stu.get(i).getId().equals(stuid)){
                System.out.println("请输入姓名");
                stu.get(i).setName(sc.next());//先找到这个对象，然后重新给这个对象赋值
                System.out.println("请输入年龄");
                stu.get(i).setAge(sc.nextInt());
                System.out.println("请输入家庭住址：");
                stu.get(i).setAddress(sc.next());
                m=0;
            }
        }
        if(m==1)
            System.out.println("该Id不存在！");
        Menu();

    }
    //查询学生
    public static void Query(ArrayList<Student> stu){
        //如果没有学生信息，提示添加信息
        if(stu.size()==0)//集合的大小为0时，集合就为空
            System.out.println("当前无学生信息，请添加后再查询！");
        else{
            System.out.println("id"+"\t\t"+"姓名"+"\t"+"年龄"+"\t"+"家庭住址");
            for(int i=0;i<stu.size();i++){
                System.out.println(stu.get(i).getId()+"\t"+stu.get(i).getName()+"\t"+
                        stu.get(i).getAge()+"\t\t"+stu.get(i).getAddress());
            }
        }

    }
}
